//compose 组合 可以将多个函数进行组合
//函数的返回结果是下一个函数的输入，就可以使用compose方法
/*function sum(a, b, c) {
  return a + b + c;
}

function len(str){
  return str.length;
}

function addTag(str){
  return '$' + str;
}

let r = addTag(len(sum('a', 'b', 'c')));
console.log(r) //$3*/


function compose(...fns){
    return function(...args){
        let lastFn = fns.pop();
        fns.reduceRight((prev, current) => {
            //TODO 函数的返回结果是下一个函数的输入，就可以使用compose方法 ← 记住这句话 关键！！
            return current(prev);
        },lastFn(...args));
    }
}

/*let compose = (...fns) => (...args) => {
  let lastFn = fns.pop();
  fns.reduceRight((prev, current) => {/!*TODO 函数的返回结果是下一个函数的输入，就可以使用compose方法 ← 记住这句话 关键！！*!/return current(prev);}, lastFn(...args));
};*/

//正着写
/*function compose(...fns){
  return fns.reduce((prev, next, index, current) => {
    return function(...args){
      return prev(next(...args))
    }
  });
}

let compose = (...fns) => fns.reduce((a, b, index, current) => (...args) => a(b(...args)));

compose(addTag, len, sum)('a', 'b', 'c');*/


